<?php

namespace app\api\library;

use Exception;
use think\exception\Handle;
use think\exception\ValidateException;
use think\exception\HttpException;
use app\common\exception\BusinessException; // 自定义业务异常（需提前创建）
use PDOException; // 数据库原生异常

/**
 * 自定义API模块的错误显示（全局异常处理）
 */
class ExceptionHandle extends Handle
{
    /**
     * 渲染异常响应
     * @param Exception $e 异常对象
     * @return \think\Response|\think\response\Json
     */
    public function render(Exception $e)
    {
        // --------------------------
        // 1. 生产环境：返回标准化错误响应（隐藏细节）
        // --------------------------
        if (!\think\Config::get('app_debug')) {
            // 初始化默认值（兜底用）
            $httpStatus = 500;    // HTTP状态码（如200/400/500）
            $bizCode = 500;       // 业务错误码（自定义，用于前端判断）
            $errorMsg = '系统内部错误'; // 用户可见的错误提示

            // 根据异常类型定制响应
            if ($e instanceof ValidateException) {
                // 验证异常：返回200（前端无需感知错误类型）+ 验证错误信息
                $httpStatus = 200;
                $bizCode = 0;
                $errorMsg = $e->getError();
            } elseif ($e instanceof BusinessException) {
                // 业务异常：使用异常自带的错误码和提示（如"地址已存在"）
                $httpStatus = $e->getCode() >= 400 ? $e->getCode() : 200;
                $bizCode = $e->getCode() ?? 1000; // 默认业务错误码（如1000=未知业务错误）
                $errorMsg = $e->getMessage();
            } elseif ($e instanceof PDOException) {
                // 数据库异常：系统繁忙（避免暴露数据库细节）
                $httpStatus = 500;
                $bizCode = 500;
                $errorMsg = '系统繁忙，请稍后再试';
            } elseif ($e instanceof HttpException) {
                // HTTP原生异常（如404 Not Found、403 Forbidden）
                $httpStatus = $e->getStatusCode();
                $bizCode = $httpStatus;
                $errorMsg = $e->getMessage() ?: '请求错误';
            }
            // 其他未捕获异常：保持默认兜底值

            // 返回标准化JSON响应
            return json([
                'code' => $bizCode,    // 业务错误码（前端可针对性处理）
                'msg' => $errorMsg,    // 错误提示
                'data' => null         // 错误时无数据
            ], $httpStatus);
        }

        // --------------------------
        // 2. 开发环境：保留默认详细错误（方便调试）
        // --------------------------
        return parent::render($e);
    }
}